查看原文
其他

手动分析VMP加密的x64驱动导入表

hzqst 看雪学院 2019-05-25

VMProtect是当前最强大的虚拟机保护软件之一,它适用于Windows平台本地编译的目标程序,支持EXE、DLL、SYS。


VMProtect是由俄罗斯人PolyTech开发的,是一个利用伪指令虚拟机的保护软件。经过VMProtect处理的软件,分析难度大大增加。越来越多的软件优先考虑使用VMProtect来保护自己的产品。另外,经过虚拟机的处理,代码执行效率将会降低,因此,一些对效率要求比较高的代码不适合用VMProtect来处理。





VMP保护的导入表会把FF 25 offset (call qword ptr[rip+offset])修改为E8 call。




跟进去可以看到先保存了rdi,后面rdi会用于堆栈平衡以及修正返回地址。



然后返回地址也就是+BE081  int  3那一行的地址被保存到rdi。







rdi被加一之后又填充回返回地址,也就是让返回地址跳过int 3指向正确的BE082 test eax,  eax那一行。







这几步相当于解密导入函数地址,从[imagebase+37DF6+14B606] + 3DDC1A68处取出函数地址放入[rsp]中。


我们用模拟器验证一下。

[imagebase+37DF6+14B606] + 3DDC1A68 确实= fffff800007165c8=RtlGetVersion
uint64_t RtlGetVersion_import = 0;
 uc_mem_read(ctx.m_uc, ctx.m_ImageBase + 0x37DF6 + 0x14B606, &RtlGetVersion_import, 8);
 RtlGetVersion_import += 0x3DDC1A68;
 std::wstring RtlGetVersion_importfrom;
 FakeAPI_t *RtlGetVersion_importapi = NULL;
 if (ctx.FindAPIByAddress(RtlGetVersion_import, RtlGetVersion_importfrom, &RtlGetVersion_importapi))
   *outs << "[ ctx.m_ImageBase + 0x37DF6 + 0x14B606]+0x3DDC1A68 = " << std::hex << RtlGetVersion_import << "name: " << RtlGetVersion_importapi->ProcedureName << "\n";






最后一步retn直接飞向[rsp]也就是刚才计算出的API地址并让最开始push rdi 减少的rsp恢复。


按照这个思路稍加修改甚至可以实现一键脱vmp壳,只要用脚本定位所有api call的地址,修复导入表。




- End -


看雪ID: hzqst                          

https://bbs.pediy.com/user-619065.htm


本文由看雪论坛 hzqst 原创

转载请注明来自看雪社区


长按识别下方图中的二维码,为Ta投票!




热门图书推荐:

立即购买!



热门技术文章:        




公众号ID:ikanxue

官方微博:看雪安全

商务合作:wsc@kanxue.com

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存